Pressidian
花园入口
笔记
项目
关于
实验室
GitHub
花园入口
笔记
项目
关于
实验室
GitHub

KNOWLEDGE PATHS

笔记库
当前位置
笔记库/前端/面试/代码/算法

5 最长回文子串 ⌚️

1 分钟阅读 · Note

目录树 578 篇

            • 5 最长回文子串 ⌚️
            • 牛客 101
            • 数组&字符串技巧
            • 算法题
            • CodeTop Top55
            • LeetCode Hot100
          • 面试-常考经典1
          • 面试-常考经典2
          • 面试-数组专项
        • 可投递企业
      • 前端技术栈
    • 笔记目录
    • CLAUDE.md
    • Vue 组件与 Render 函数

关联笔记 6

↗牛客 101同一路径↗数组&字符串技巧同一路径↗算法题同一路径↗CodeTop Top55同一路径↗LeetCode Hot100同一路径↗解析模板字符串共同主题
  • 5 最长回文子串 ⌚️

5 最长回文子串 ⌚️

> Last Format Time:7/9/2026 23:46:20

6/12/26 【标签写法避免被解析为 H1】 原内容:#双指针


问题分析

你的 while 条件中使用了 l > 0 和 r < n - 1:

while (s[l] === s[r] && l &gt; 0 && r &lt; n - 1) { ... }

越界/漏判问题

l > 0 意味着当 l == 0 时就会停止循环,导致无法检查索引为 0 的位置;同理 r < n - 1 导致无法检查最后一个字符。正确的边界应该是 l >= 0 和 r < n。

短路求值风险

将 s[l] === s[r] 放在最前面是不安全的。当 l 或 r 越界时,JavaScript 会抛出 Cannot read properties of undefined 的错误。必须把边界检查放在字符比较的前面。


修正后的完整代码

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function (s) {
    let maxLen = 0
    let ans = ''
    if (s.length === 0) return ans
    if (s.length === 1) return s

    const n = s.length

    for (let i = 0; i < n; i++) {
        let l = i
        let r = i

        while (l >= 0 && r < n && s[l] === s[r]) {
            l--
            r++
        }

        if (maxLen < r - l - 1) {
            maxLen = r - l - 1
            ans = s.slice(l + 1, r)
        }
    }

    for (let i = 0; i < n; i++) {
        let l = i
        let r = i + 1

        while (l >= 0 && r < n && s[l] === s[r]) {
            l--
            r++
        }

        if (maxLen < r - l - 1) {
            maxLen = r - l - 1
            ans = s.slice(l + 1, r)
        }
    }

    return ans
};